package com.sxt;

import java.awt.*;

/**
 * @author 谭梦寻
 * @version 1.1
 * 红线
 */
public class Line {
    //    设置参数 起点坐标
    int x = 380;
    int y = 180;
    //    终点坐标
    int endX = 500;
    int endY = 500;
    //  线长 角度
    double length = 100;
//    最小值
    double lengthMin = 100;
//    最大值
    double lengthMax = 750;
    /*
   在计算机中 X轴正方向是向右的，Y轴正方向是向下的
   角度起点为X轴正方向 角度90度 在弧度制中是π/2，即1.57
   1小于1.57所以在Y轴的右边 2小于1.57所以在Y轴的左边
     */
    double angle = 0;
    //    控制红线方向的参数
    int dir = 1;
    //    红线的状态 状态 0：摇摆 1：收回
    int state;
//  勾爪图片
    Image hook = Toolkit.getDefaultToolkit().createImage("img/hook.png");
    //    抓取判定
    GameWin frame;

    //    有参构造器
    Line(GameWin frame) {
        this.frame = frame;
    }

    //    编写方法判断是否抓到了 碰撞检测
    void logic() {
        for (Object obj : this.frame.objectList) {
            if (endX > obj.x && endX < obj.x + obj.width && endY > obj.y && endY < obj.y + obj.height) {
//            如果条件成立 则抓取到了
//            System.out.println("抓到了");
                state = 3;
                obj.flag = true;//标记为可移动
            }
        }

    }

    //    封装 绘制方法
    void lines(Graphics g) {
        endX = (int) (x + length * Math.cos(angle * Math.PI));
        endY = (int) (y + length * Math.sin(angle * Math.PI));
        g.setColor(Color.red);
//        利用平行线是的红线加粗
        g.drawLine(x-1, y, endX-1, endY);//画线
        g.drawLine(x, y, endX, endY);//画线
        g.drawLine(x+1, y, endX+1, endY);//画线
        g.drawImage(hook,endX-36,endY-2,null);
    }

    //    绘制方法
    void paintSelf(Graphics g) {
//        调用判断是否抓到了东西的函数
        logic();
        switch (state) {
            case 0:
                if (angle < 0.1) {
                    dir = 1;
                } else if (angle > 0.9) {
                    dir = -1;
                }
//        不断改变角度的值
                angle = angle + 0.005 * dir;
                lines(g);
                break;
            case 1: //放线抓取
//                添加线的长度
                if (length < lengthMax) {
                    length += 10;
                    lines(g);
                } else {
                    state = 2;
                }
                break;
            case 2://收回
                if (length > lengthMin) {
                    length -= 10;
                    lines(g);
                } else {
                    state = 0;//返回初始状态
                }
                break;
            case 3: //取回线
                int m = 1;
                if (length > lengthMin) {//抓到了
                    length -= 10;
                    lines(g);
                    for (Object obj : this.frame.objectList) {
//                    金块的状态改变
                        if (obj.flag) { //如果标记为可移动
                            m = obj.m;//接收质量来控制线的拉去速度
                            obj.x = endX - obj.getWidth()/2;
                            obj.y = endY;
                            if (length <= 100) {//抓取成功移除金块
                                obj.x = -150;
                                obj.y = -150;
//                                移动完毕 修改回状态
                                obj.flag = false;
//                                药水回复
                                Bg.waterFlag = false;
//                                抓到东西加分
                                Bg.count+= obj.count;
                                state = 0;//返回初始状态

                            }
                            //判断是否使用了药水
                            if(Bg.waterFlag) {
//                                为了区分石块还是金块 ，给他们添加标记
                                if(obj.type==1) {
//                                    如果是金块
                                    m=1;
                                }else if (obj.type == 2) {
//                                    如果是石块
                                    obj.x = -150;
                                    obj.y = -150;
                                    obj.flag = false;
//                                    返回新的状态
                                    Bg.waterFlag = false;
                                    state = 2;
                                }
                            }
                        }

                    }
                }
                try {
                    Thread.sleep(m);
                } catch (Exception e) {
                    e.printStackTrace();
                }
                break;
        }

    }

//    重置线元素
    void reGame() {
        dir = 0;
        length = 100;
    }
}
